package ar.com.cubika.trainees.bean.transportes.actividades;

import java.util.Collection;
import java.util.Date;

import ar.com.cubika.trainees.bean.transportes.vehiculos.Vehiculo;
import ar.com.cubika.trainees.date.DateUtils;

/**
 * Objeto que representa las actividades que un vehiculo va a llevar a cabo
 * en un dia.
 * <b>OJO</b> el Plan no verifica su correccion respecto 
 * de las actividades ingresadas, esta responsabilidad le cabe al que crea
 * un PlanDiario.
 * @author clombardi
 * @see ar.com.cubika.trainees.bean.transportes.vehiculos.Vehiculo
 * @see ar.com.cubika.trainees.bean.transportes.vehiculos.Vehiculo#getPlan(Date)
 */
public abstract class PlanDiario {
	private Vehiculo vehiculo;
	private Date fecha;

	
	/**
	 * Un constructor razonable, todo plan debe referirse a un vehiculo 
	 * y a una fecha.
	 */
	public PlanDiario(Vehiculo vehiculo, Date fecha) {
		this.vehiculo = vehiculo;
		this.fecha = fecha;
	}

	/**
	 * El vehiculo del plan.
	 */
	public Vehiculo getVehiculo() {
		return this.vehiculo;
	}
	
	/**
	 * El dia al que se refiere el plan.
	 */
	public Date getFecha() {
		return this.fecha;
	}
	
	
	/**
	 * Las actividades que va a llevar a cabo el vehiculo.
	 * @return una Collection de Actividades
	 * @see Actividad 
	 */
	public abstract Collection getActividades();
	
	/**
	 * La cantidad de tiempo ocupado que tiene el vehiculo en el dia, medida
	 * en horas.
	 * Tiempo ocupado = tiempo asignado a actividades.
	 */
	public abstract double getTiempoOcupado();
	
	/**
	 * Indica si el vehiculo esta <b>totalmente</b> libre el dia de referencia.
	 */
	public abstract boolean isLibre();
	
	/**
	 * Una descripcion legible por un humano del plan del dia del vehiculo,
	 * incluyendo vehiculo y fecha.
	 */
	public String getDescripcionCompleta() {
		return this.getDescripcionBase() + ":\n\t" + 
				this.getDescripcionEstricta();
	}

	/**
	 * Una descripcion legible por un humano del plan del dia del vehiculo,
	 * sin incluir vehiculo ni fecha.
	 */
	public abstract String getDescripcionEstricta();

	/**
	 * Encabezado de la descripcion completa: vehiculo y fecha.
	 */
	protected String getDescripcionBase() {
		return "Plan de " + this.getVehiculo() + " para " + DateUtils.formatDate(this.getFecha());
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	public String toString() {
		return this.getDescripcionCompleta();
	}

}
